﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Project.UserControls;
using System.IO;
using System.Xml;
using Project.Model;
using Project.Controller;

namespace Project.View
{
    public partial class GUI : Form
    {
        private UserControl control;

        public GUI()
        {
            InitializeComponent();
            this.control = new Start_UserControl();
            this.Controls.Add(this.control);
        }

        public void toonMenu()
        {
            this.Controls.Remove(this.control);
            this.control = new Start_UserControl();
            this.Controls.Add(this.control);
        }

        public void afsluitenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (ShowOpslaanDialog())
            {
                if (this.ShowSaveDialog())
                {
                    Close();
                }
            }
            else
            {
                Close();
            }
        }

        public bool CheckOpslaan()
        {
            if (this.control is Spel_UserControl)
            {
                if (ShowOpslaanDialog())
                {
                    if (!ShowSaveDialog())
                    {
                        return false;
                    }
                }
            }
            return true;
        }

        public void nieuwSpelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (CheckOpslaan())
            {
                this.Controls.Remove(this.control);
                this.control = new NieuwSpel_UserControl();
                this.Controls.Add(this.control);
                this.UpdateOpslaanMenuItem();
            }
        }

        public void WinnaarScherm(string winnaar, Color kleur)
        {
            this.Controls.Remove(this.control);
            this.control = new Winnaar_UserControl(winnaar, kleur);
            this.Controls.Add(this.control);
            this.UpdateOpslaanMenuItem();
        }

        public void spelLadenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (CheckOpslaan())
            {
                if (this.openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    this.LaadSpel();
                }
            }
        }

        public void LaadSpel()
        {
            FileStream fs;
            if ((fs = new FileStream(this.openFileDialog.FileName, FileMode.Open)) != null)
            {
                int worp = -1;
                int huidigeSpeler = -1;
                string status = "";
                Speler[] spelers = new Speler[4];
                int[,] pionnen = new int[16, 5];
                int speler = 0;
                int pion = 0;
                XmlReader x = XmlReader.Create(fs);
                while (x.Read())
                {
                    XmlNodeType type = x.NodeType;
                    switch (type)
                    {
                        case XmlNodeType.Element:
                            if (x.Name == "Spel")
                            {
                                worp = int.Parse(x.GetAttribute("Worp"));
                                huidigeSpeler = int.Parse(x.GetAttribute("HuidigeSpeler"));
                                status = x.GetAttribute("Status");
                            }
                            else if (x.Name == "Speler")
                            {
                                if (x.GetAttribute("Bot") == "true")
                                {
                                    spelers[speler] = new Bot(x.GetAttribute("Naam"), Color.FromArgb(int.Parse(x.GetAttribute("Color"))), (BotMoeilijkheid)Enum.Parse(typeof(BotMoeilijkheid), x.GetAttribute("Moeilijkheid")), (BotStrategy)Enum.Parse(typeof(BotStrategy), x.GetAttribute("Strategy")));
                                    if (int.Parse(x.GetAttribute("LaatstePionVerplaats")) != -1)
                                    {
                                        spelers[speler].LaatstePionVerplaats = spelers[speler].Pionnen[int.Parse(x.GetAttribute("LaatstePionVerplaats"))];
                                    }
                                }
                                else
                                {
                                    spelers[speler] = new Speler(x.GetAttribute("Naam"), Color.FromArgb(int.Parse(x.GetAttribute("Color"))));
                                }
                                speler++;
                            }
                            else if (x.Name == "Pion")
                            {
                                pionnen[pion, 0] = speler - 1;
                                pionnen[pion, 1] = pion - (4 * (speler - 1));
                                pionnen[pion, 2] = (x.GetAttribute("Move") == "true") ? 1 : 0;
                                pionnen[pion, 3] = (x.GetAttribute("PionMoetTerug") == "true") ? 1 : 0;
                                pionnen[pion, 4] = int.Parse(x.GetAttribute("VakNummer"));
                                pion++;
                            }
                            break;
                    }
                }
                if (this.control is Spel_UserControl)
                {
                    ((Spel_UserControl)this.control).Spel.Log.Close();
                }
                Spel_UserControl suc = new Spel_UserControl(spelers, this);
                suc.Spel.Worp = worp;
                suc.Spel.HuidigeSpeler = huidigeSpeler;
                suc.Spel.Status = status;
                for (int i = 0; i < spelers.Count(); i++)
                {
                    suc.Spel.Spelers[i].Worp = worp;
                }
                for (int z = 0; z < 16; z++)
                {
                    suc.Spel.PlaatsPion(pionnen[z, 0], pionnen[z, 1], (pionnen[z, 2] == 1) ? true : false, (pionnen[z, 3] == 1) ? true : false, pionnen[z, 4]);
                }
                suc.Spel.UpdateBord();
                suc.setGooiButton();
                suc.UpdateDiceImage();
                this.Controls.Remove(this.control);
                this.control = suc;
                this.Controls.Add(this.control);
                this.UpdateOpslaanMenuItem();
                fs.Close();
            }
        }

        public bool ShowSaveDialog()
        {
            if (this.saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                FileStream fs;
                if ((fs = new FileStream(this.saveFileDialog.FileName, FileMode.Create)) != null)
                {
                    Spel spel = ((Spel_UserControl)this.control).Spel;

                    XmlWriterSettings XMLSettings = new XmlWriterSettings();
                    XMLSettings.Indent = true;
                    XmlWriter w = XmlWriter.Create(fs, XMLSettings);

                    w.WriteStartDocument();

                    w.WriteStartElement("Spel");

                    w.WriteAttributeString("Worp", spel.Worp.ToString());
                    w.WriteAttributeString("HuidigeSpeler", spel.HuidigeSpeler.ToString());
                    w.WriteAttributeString("Status", spel.Status);

                    for (int i = 0; i < spel.Spelers.Count(); i++)
                    {
                        Speler speler = spel.Spelers[i];
                        w.WriteStartElement("Speler");
                        w.WriteAttributeString("Naam", speler.Naam);
                        w.WriteAttributeString("Color", speler.Color.ToArgb().ToString());
                        w.WriteAttributeString("Bot", (speler is Bot) ? "true" : "false");
                        if (speler is Bot)
                        {
                            w.WriteAttributeString("Moeilijkheid", ((Bot)speler).Moeilijkheid.ToString());
                            w.WriteAttributeString("Strategy", ((Bot)speler).Strategy.ToString());
                        }
                        int laatstePionVerplaats = -1;
                        for (int a = 0; a < 4; a++)
                        {
                            if (speler.Pionnen[a] == speler.LaatstePionVerplaats)
                            {
                                laatstePionVerplaats = a;
                            }
                        }
                        w.WriteAttributeString("LaatstePionVerplaats", laatstePionVerplaats.ToString());
                        for (int j = 0; j < 4; j++)
                        {
                            Pion pion = speler.Pionnen[j];
                            w.WriteStartElement("Pion");
                            w.WriteAttributeString("VakNummer", pion.Vak.VakNummer.ToString());
                            w.WriteAttributeString("Move", pion.Move.ToString());
                            w.WriteAttributeString("PionMoetTerug", pion.PionMoetTerug.ToString());
                            w.WriteEndElement();
                        }
                        w.WriteEndElement();
                    }

                    w.WriteEndElement();

                    w.WriteEndDocument();
                    w.Flush();
                    fs.Close();
                }
                return true;
            }
            return false;
        }

        public bool ShowOpslaanDialog()
        {
            return (MessageBox.Show("Opslaan", "Eerst opslaan?", MessageBoxButtons.YesNo) == DialogResult.Yes) ? true : false;
        }

        private void spelOpslaanToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.ShowSaveDialog();
        }

        public void UpdateOpslaanMenuItem()
        {
            this.spelOpslaanToolStripMenuItem.Enabled = (this.control is Spel_UserControl);
        }

        public UserControl ControlProperty
        {
            get { return control; }
            set { control = value; }
        }
    }
}
